#ifndef SEQUENCE_FILTER
#define SEQUENCE_FILTER
/**
  *************************************************************************************************
  * @file     sequencefilter.h
  * @author   
  * @version  V1.0.0
  * @date     2021.7.24
  * @brief    控制算法pid的程序实现，宏函数形式
  * @remarks
  **************************************************************************************************
  * @attention  1、该文件用宏定义函数写成，使用之前需要先声明使用对象，声明使用对象才能调用相应的函数，有点类似于面向对象语言的类和对象
  *             2、文件包含均值滤波器与中值滤波器，根据需求自行调用
  **************************************************************************************************
  */
#define MAKE_SEQFILTER_MED(name,type,size) \
        static type name##Flt[size] = {0}; \
         type name##Get(){ return name##Flt[size>>1]; }\
         void name##Set(type val){\
            for( int i=0; i<size; ++i ){\
                if( val < name##Flt[i] ){\
                    for( int j=size-1; j>i; --j ){ name##Flt[j] = name##Flt[j-1]; }\
                    name##Flt[i] = val; \
                    break;\
                }else if( val > name##Flt[size-1-i] ){\
                    for( int j=0; j<size-1-i; ++j ){ name##Flt[j] = name##Flt[j+1]; }\
                    name##Flt[size-1-i] = val; \
                    break;\
                }\
            }\
        }
        
#define MAKE_SEQFILTER_AVR(name,type,size) \
        static type name##Flt[size] = {0}; \
        static double name##FltSum = 0; \
        static double name##FltRat = 1.0/size;\
         type name##Get(){ return name##FltSum*name##FltRat; }\
         void name##Set(type val){\
            double lastval =  name##Flt[size-1];\
            for( int i=size-1; i>0; --i ){ name##Flt[i] = name##Flt[i-1]; }\
            name##Flt[0] = val;\
            name##FltSum += ((double)(val)-lastval);\
        }
         

#define MAKE_SEQFILTER_MAX(name,type,size) \
        static type name##Flt[size] = {0}; \
         type name##Get(){ return name##Flt[size-1]; }\
         void name##Set(type val){\
            for( int i=0; i<size; ++i ){\
                if( val < name##Flt[i] ){\
                    for( int j=size-1; j>i; --j ){ name##Flt[j] = name##Flt[j-1]; }\
                    name##Flt[i] = val; \
                    break;\
                }else if( val > name##Flt[size-1-i] ){\
                    for( int j=0; j<size-1-i; ++j ){ name##Flt[j] = name##Flt[j+1]; }\
                    name##Flt[size-1-i] = val; \
                    break;\
                }\
            }\
        }
         

#endif
